home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Modules
/
BackSpaceModules
/
Source
/
AquariumView
/
Fish.m
< prev
next >
Wrap
Text File
|
1993-03-12
|
4KB
|
175 lines
#ifndef NS3x
#import "Thinker.h"
#import <appkit/defaults.h>
#else
#import "Thinker3.h"
#endif
#import "Fish.h"
#import "FishBrain.h"
#import <appkit/Application.h>
#import "RotImage.h"
#import <dpsclient/wraps.h>
#import <appkit/View.h>
#import <stdio.h>
#import <libc.h>
#import <math.h>
#include <sys/stat.h>
#define FISHPICTS 20 // Maximum number without recompile
#define NUMBER_OF_FRAMES 1 // Need more frames eventually
@implementation Fish
- init:sender
{
NXRect bufferRect;
struct stat statbuf;
char appDirectory[MAXPATHLEN], *lastSlash, fishfile[MAXPATHLEN];
aquarium = sender;
sizeOfAquar.width = 700;
sizeOfAquar.height = 700;
srandom(currentTimeInMs());
do {
#ifndef NS3x
strcpy(appDirectory,NXArgv[0]);
lastSlash = rindex(appDirectory,'/');
strcpy((lastSlash?lastSlash+1:appDirectory),"FishFolder");
sprintf(fishfile,"%s/fish.%d.tiff",appDirectory,random() % FISHPICTS + 1);
#else
sprintf(fishfile,"%s/FishFolder/fish.%d.tiff",[BSThinker() moduleDirectory:"Aquarium"],(int)(random() % FISHPICTS + 1));
#endif
} while(stat(fishfile,&statbuf) == -1);
fish = [[RotImage allocFromZone:[self zone]] initFromFile:fishfile];
[fish getSize:&bufferRect.size];
bufferRect.size.width /= (NUMBER_OF_FRAMES);
WIDTH=bufferRect.size.width;
HEIGHT=bufferRect.size.height;
brain = [[FishBrain allocFromZone:[self zone]] init:&sizeOfAquar
fishSize:&bufferRect.size owner:fish];
bufferRect.size.width += MAX_X_SPEED;
bufferRect.size.height += MAX_Y_SPEED;
buffer = [[NXImage alloc] initSize:&bufferRect.size];
if ([buffer lockFocus]) {
[self clearBuffer];
[buffer unlockFocus];
}
return self;
}
- move:listOfFish
{
NXRect tmpRect, myRect = {0,0,0,0};
NXPoint otherTo = {0,0};
NXRect new;
int x = 0;
id tmpObject;
new.origin.x = [brain getXPos];
new.origin.y = [brain getYPos];
new.size.width = WIDTH + (MAX_X_SPEED/2);
new.size.height = HEIGHT + (MAX_Y_SPEED/2);
[buffer lockFocus];
[self clearBuffer];
/*
* The semantics that I'm using for this is that the lower indices are
* 'behind' this fish. The one after it in the list are in 'front' of it.
*/
while((tmpObject = [listOfFish objectAt:x++]) != self) {
tmpRect = [tmpObject getRect];
if (NXIntersectsRect(&tmpRect,&new)) {
otherTo.x = tmpRect.origin.x - new.origin.x + (MAX_X_SPEED/2);
otherTo.y = tmpRect.origin.y - new.origin.y + (MAX_Y_SPEED/2);
[tmpObject simpleDraw:&otherTo];
}
}
// Draw me.
myRect.origin.x += (MAX_X_SPEED/2);
myRect.origin.y += (MAX_Y_SPEED/2);
[self simpleDraw:&myRect.origin];
// Here is where to draw other fish in front of this one.
while((tmpObject = [listOfFish objectAt:x++]) != self && tmpObject != nil) {
tmpRect = [tmpObject getRect];
if (NXIntersectsRect(&tmpRect,&new)) {
otherTo.x = tmpRect.origin.x - new.origin.x + (MAX_X_SPEED/2);
otherTo.y = tmpRect.origin.y - new.origin.y + (MAX_Y_SPEED/2);
[tmpObject simpleDraw:&otherTo];
}
}
[buffer unlockFocus];
[buffer composite:NX_COPY toPoint:&new.origin];
old = new;
return self;
}
- viewDidResize;
{
NXSize imageSize;
NXRect rect;
// old.l = old.r = old.b = old.t = fishTo.x = fishTo.y = 0;
[aquarium getFrame:&rect];
sizeOfAquar = rect.size;
[fish getSize:&imageSize];
[brain viewDidResize:&sizeOfAquar];
return self;
}
-(NXRect)getRect
{
NXRect tmp;
tmp = old;
tmp.size.width += (2*MAX_X_SPEED) + 1;
tmp.size.height += (2*MAX_Y_SPEED) + 1;
return tmp;
}
-simpleDraw:(NXPoint *)point
{
[fish composite:NX_SOVER toPoint:point];
return self;
}
-clearBuffer
{
// Buffer must have already have the focus locked on it for this to work.
NXRect tmp = {0,0,0,0};
[buffer getSize:&tmp.size];
PSsetgray(NX_BLACK);
NXRectFill(&tmp);
return self;
}
@end